package com.cskaoyan.javase.oop1._11static._2compare;

/**
 * static与非static的比较
 * 我们从以下四个角度比较（拿成员变量为例）
 *      1.成员的所属
 *          成员变量: 对象
 *          静态变量: 类
 *
 *      2.在内存中的位置
 *          成员变量: 堆上的对象里
 *          静态变量: 堆上
 *
 *      3.在内存中出现的时间
 *          成员变量: 创建对象之后才出现
 *          静态变量: 类加载结束就完成初始化赋值了
 *          静态变量一定先出现,因为假如成员变量都存在了,那么类加载一定进行了
 *              静态变量也一定早就存在了
 *          静态成员是一定先于普通成员出现的
 *
 *      4.调用方式
 *          成员变量: 对象名点
 *          静态变量: 类名点
 *
 * 接下来看成员方法的调用/特点:
 *      Java中的日常定义的方法,就两种,成员方法和静态方法
 *      那么在类的成员方法中,能够访问以下哪些结构呢?
 *          a.普通成员
 *          b.静态成员
 *          两个都可以,因为成员方法中已经存在this自身对象了,对象都存在了
 *          类加载一定进行了,静态成员一定可以访问了.
 *
 *      那么在类的静态成员方法中,能够访问以下哪些结构呢?
 *          a.普通成员,不可以
 *          b.静态成员,可以
 *          静态成员仅需要类加载就可以访问了
 *          类加载后,一定创建对象吗?当然不一定
 *          因为启动main方法等也会触发类加载,类加载不一定是new对象触发的
 *
 *
 * @since 15:48
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student.testStatic();
    }
}

class Student {
    int a = 10;
    static int b = 20;

    public void test() {
        // 成员方法中可以任意访问静态成员
        System.out.println(b);
        testStatic();
        System.out.println(a);
    }

    public static void testStatic() {
        System.out.println(b);
        Student s = new Student();
        System.out.println(s.a);
        // System.out.println(a);
        // test();
    }
}